perm filename XAPOLD[XGP,BGB] blob
sn#043291 filedate 1973-05-23 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00026 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00004 00002 TITLE XAP - XEROX ASSEMBLE AND PRINT - BGB - 27 JANUARY 1973.
C00007 00003 ALTERNATE PDP-10 MNEMONICS.
C00010 00004 SUBR(MKBUF) MAKE XGP BUFFER.
C00011 00005 SUBR(XGPOUT) OUTPUT BUFFER TO XGP.
C00013 00006 SUBR(PLAG)G PLACE A GLYPH INTO XGP BUFFER AT ROW,COL.
C00015 00007 SUBR(PRINT)CHR PLACE A GLYPH INTO XGP BUFFER AT ROW,COL.
C00017 00008 INCLUSIVE OR GLYPH BITS INTO THE XGP BUFFER.
C00018 00009 SUBR(PLTVEC)XN,YN PLOT LINE SEGMENT INTO XGP BUFFER.
C00022 00010 SUBR(IIISIM) OUTPUT III BUFFER ONTO XGP.
C00024 00011 FETCH AND DECODE III COMMAND WORD.
C00026 00012 IIISIM CONTINUED.
C00028 00013 SUBR(GETFIL) GET FILE SPEC FROM TTY LINE.
C00030 00014 SUBR(INITIO) GET AND OPEN A CHANNEL.
C00031 00015 SUBR(GETCHR) GET CHARACTER AND SKIP.
C00033 00016 SUBR(INITXT) INITIALIZE TEXT FILE.
C00035 00017 SUBR(DEFONT) DEFINE A FONT.
C00039 00018 SUBR(SETFNT) SETUP A FONT.
C00040 00019 START ADDRESS ENTRY.
C00042 00020 RPG-ENTRY.
C00044 00021 XGP PRINT A CHARACTER.
C00046 00022 EXECUTE COMMAND CHARACTERS.
C00047 00023 ESCAPE CHARACTER TABLE.
C00052 00024 XAP DOCUMENTATION.
C00053 00025 XAP TILDE COMMANDS.
C00055 00026 XAP RUBOUT COMMANDS.
C00059 ENDMK
C⊗;
TITLE XAP - XEROX ASSEMBLE AND PRINT - BGB - 27 JANUARY 1973.
ORGBUF:0 ;BUFFER FOR ONE PAGE OF XGP BINARY OUTPUT.
ENDBUF:0
ROW:0↔COL:0 ;XGP "PEN" POSITION.
DROW:0↔DCOL:0
MAXFILES←←5 ;NUMBER OF INDIRECTED FILES
MAXFONT←←=9 ;NUMBER OF FONTS
;XGP RASTER DIMENSIONS.
WWIDTH←←=41 ;WORD WIDTH OF A ROW.
NCOLS←←(WWIDTH-1)*=36 ;NUMBER OF COLUMNS.
MROWS←←=2000 ;NUMBER OF ROWS.
BUFSIZ←←WWIDTH*MROWS ;SIZE OF XGP BUFFER.
;JOB DATA AREA.
EXTERN JOBJDA ;140 END OF JOB DATA AREA.
EXTERN JOBFF ;121 TOP OF USED CORE POINTER.
EXTERN JOBSA ;120 XWD ORGINAL-TOP,START-ADDR.
EXTERN JOBREL ; 44 PHYSICAL TOP OF CORE IMAGE.
RMAR:NCOLS↔LMAR:=100
ROWMIN:=100↔ROWMAX:MROWS
FILNAM: 0 ;FILE NAME.
EXTION: 0↔0 ;EXTENSION.
PPPN: 0↔0 ;PROJECT-PROGRAMMER.
FNTPPN: SIXBIT/XGPSYS/ ;DEFAULT FONT PPN
IOPTR: 0 ;POINTER INTO FILE STACK
IBUF: BLOCK 4*MAXFILES ;FILE STACK
CHANTB←IBUF+3
TTYFLA: 0 ;INPUT FROM TTY
RPGSW: 0
FONT: 0
FONTAB: BLOCK =10
PDL: BLOCK 100 ;CONTROL PUSH DOWN.
PAT: BLOCK 100 ;PATCH AREA.
;ALTERNATE PDP-10 MNEMONICS.
DEFINE O(A,B){OPDEF A[B]}
O LIP,HLR↔O LAP,HRR↔O DIP,HRLM↔O DAP,HRRM
O ZIP,HRRZS↔O ZAP,HLLZS↔O WIP,HRROS↔O WAP,HRRZS
O CAR,HLRZ↔O LIPI,HRLI↔O LAPI,HRRI↔O DIPZ,HRLZM
O CDR,HRRZ↔O LACI,MOVEI↔O SLACI,MOVSI↔O DAPZ,HRRZM
O LAC,MOVE↔O LACN,MOVN↔O LACM,MOVM↔O SLAC,MOVS
O DAC,MOVEM↔O DACN,MOVNM↔O DACM,MOVMM↔O SDAC,MOVSM
O NIP,HLRE↔O NAP,HRRE↔O NIM,HRREI↔O GO,JRST
O FLOAT,FSC 233↔O FIXX,FIX 233000↔O DZM,SETZM
;SAIL LIKE SUBROUTINE LINKAGE.
↓P←←17
DEFINE SUBR(NAME){INTERN NAME↔↓NAME: ;}
DEFINE CALL(NAME,X1,X2,X3,X4){
IFDIF <> <X1> {PUSH 17,X1↔IFDIF <> <X2> {PUSH 17,X2
IFDIF <> <X3> {PUSH 17,X3↔IFDIF <> <X4> {PUSH 17,X4}}}}
PUSHJ 17,NAME}
DEFINE ARG1<-1(17)>↔DEFINE ARG2<-2(17)>
DEFINE ARG3<-3(17)>↔DEFINE ARG4<-4(17)>
DEFINE SETQ(VAR,LIST){CALL(LIST)↔DAC 1,VAR}
;RETURN FROM AN N-ARGUMENT SUBROUTINE CALL.
DEFINE POP0J <POPJ 17,>
↓POP1J.:SUB 17,[2(2)]↔GO@2(17)↔DEFINE POP1J<GO POP1J.>
↓POP2J.:SUB 17,[3(3)]↔GO@3(17)↔DEFINE POP2J<GO POP2J.>
↓POP3J.:SUB 17,[4(4)]↔GO@4(17)↔DEFINE POP3J<GO POP3J.>
↓POP4J.:SUB 17,[5(5)]↔GO@5(17)↔DEFINE POP4J<GO POP4J.>
;ACCUMULATOR AND TEMPORARY DATA MANAGEMENT.
DEFINE ACCUMULATORS(LIST){ACPTR←←2
FOR AC⊂(LIST)<AC←ACPTR↔ACPTR←←ACPTR+1↔>}
DEFINE DECLARE (LIST){
FOR VARNAM⊂(LIST)<VARNAM: 0↔>}
;FATAL ERROR MESSAGE.
DEFINE FATAL(STR){PUSHJ 17,FATAL.↔ASCIZ/STR/}
FATAL.:OUTSTR[BYTE(7)15,12(21)"FAT"↔"AL - "⊗1↔0]
OUTSTR @(17)↔INCHRW↔GO .-1↔LIT
DEFINE CRLF{OUTSTR[BYTE(7)15,12]}
%←←400000
SUBR(MKBUF) MAKE XGP BUFFER.
BEGIN MKBUF;------------------------------------------------------
;EXPAND CORE FOR XGP BUFFER.
CDR JOBFF↔DAC ORGBUF
ADDI BUFSIZ↔DAC ENDBUF↔AOS ORGBUF
ADDI 10↔DAC JOBFF↔IORI 1777
CALLI 11↔GO [FATAL(CAN'T GET CORE FOR XGP BUFFER)]
;CLEAR XGP BUFFER.
LAC 1,ORGBUF↔SETZM(1)
DIP 1,1↔AOS 1↔BLT 1,@ENDBUF
POP0J
BEND MKBUF;BGB 27 JANUARY 1973.-----------------------------------
SUBR(XGPOUT) OUTPUT BUFFER TO XGP.
BEGIN XGPOUT;-----------------------------------------------------
;PUT CONTROL WORD IN EACH ROW.
LAC[1B11+=100B23]↔ADDI WWIDTH-1
LAC 1,ORGBUF
LACI 2,MROWS ;NUMBER OF ROWS.
DAC(1)↔ADDI 1,WWIDTH ;ROW WORD WIDTH.
SOJG 2,.-2
;CALL THE IOTS.
LAC ORGBUF↔SOS↔DAP OUT2
INIT 2,17↔SIXBIT/XGP/↔0↔HALT
SETZ 1,
SEGNUM 1,
DETSEG
LOCK
OUTSTR[ASCIZ/OUTPUTING PAGE TO XGP.../]
OUT 2,OUT1
SKIPA
OUTSTR[ASCIZ/XGP GAVE AN ERROR RETURN.
/]
UNLOCK
RELEASE 2,
OUTSTR[ASCIZ/PAGE FINISHED.
/]
JUMPE 1,.+3
ATTSEG 1,
GO [OUTSTR[ASCIZ/OOPS, MY SEGMENT WENT AWAY. /]
HALT .+1]
;CLEAR XGP BUFFER.
LAC 1,ORGBUF↔SETZM(1)
DIP 1,1↔AOS 1
CDR 2,ENDBUF↔BLT 1,(2)
POP0J
;-----------------------------------------------------------------
OUT1: IOWD 2,HACK1
OUT2: IOWD BUFSIZ,0
OUT3: IOWD 2,HACK2
0
HACK1: 1B0
1B0 + =80B11
HACK2: 1B0 + =80B11
0↔0
BEND;1/31/73------------------------------------------------------
SUBR(PLAG)G PLACE A GLYPH INTO XGP BUFFER AT ROW,COL.
BEGIN PLAG;-------------------------------------------------------
;BGB - 27 JANUARY 1973.
ACCUMULATORS{G,B,B2,M,N,I}
LAC G,ARG1
;ORIGIN AND BUFFER POINTER.
NIP 1(G)↔ADD ROW↔DAC ROW
IMULI WWIDTH↔ADD ORGBUF↔DAPZ B
NAP 1(G)↔ADD COL↔DAC COL
IDIVI =36↔AOS
ADD B,0↔MOVNS 1↔DAP 1,L3
CAR M,0(G)↔CDR N,0(G)
DIP G,G↔ADDI G,3
DAC B,B2
;INCLUSIVE OR GLYPH BITS INTO THE XGP BUFFER.
L1: LAC I,N
L2: LAC 0,(G)↔SETZ 1,
L3: LSHC 0,0
CAML B,ORGBUF↔CAMLE B,ENDBUF↔SKIPA↔IORM 0,(B)
AOS B
CAML B,ORGBUF↔CAMLE B,ENDBUF↔SKIPA↔IORM 1,(B)
AOS G
SOJG I,L2↔LAC B,B2
ADDI B,WWIDTH↔DAC B,B2
SOJG M,L1↔LIP G,G
;TERMINUS.
NIP 2(G)↔ADD ROW↔DAC ROW
NAP 2(G)↔ADD COL↔DAC COL
POP1J
BEND;1/27/73------------------------------------------------------
SUBR(PRINT)CHR PLACE A GLYPH INTO XGP BUFFER AT ROW,COL.
BEGIN PRINT;------------------------------------------------------
ACCUMULATORS{G,B,B2,M,N,I}
LAC 1,FONT ;CURRENT FONT NUMBER.
LAC 2,FONTAB(1) ;FONT BASE ADDRESS.
LAC 0,203(2) ;ROWS BETWEEN TOP AND BASE LINE.
ADD 2,ARG1 ;POINTER INTO FONT'S CHARACTER TABLE.
CAR N,(2) ;COLS WIDE OF THE GLYPH.
CDR G,(2)
ADD G,FONTAB(1)↔AOS G ;CHARACTER'S GLYPH POINTER.
CDR M,(G) ;ROWS HIGH OF THE GLYPH.
CAR 1,(G) ;ROWS FROM TOP TO FIRST ROW OF GLYPH.
SUB 0,1 ;ROWS ABOVE CURRENT XGP PEN POSITION.
ADD 0,ROW
IMULI WWIDTH
ADD ORGBUF↔DAPZ B ;WORD POINTER INTO XGP BUFFER.
LAC 0,COL↔IDIVI 0,=36 ;REMAINDER IN AC-1 !
AOS↔ADD B,0 ;WORD POINTER INTO XGP BUFFER.
ADDM N,COL ;UPDATE XGP PEN COLUMN POSITION.
TLO G,444400 ;SETUP GLYPH BYTE POINTER.
CAIL N,=36↔GO[
IDIVI N,=36↔AOJA N,L0] ;WHEN CHARACTER WIDTH ≥ =36.
DPB N,[POINT 6,G,11] ;SIZE OF BYTE.
ADDI 1,-=35(N) ; =36 - CHRWID - REMAINDER
LACI N,1
L0: MOVNS 1↔DAP 1,L3 ;BYTE POSITION WITH RESPECT TO WORD BOUNDARYS.
;INCLUSIVE OR GLYPH BITS INTO THE XGP BUFFER.
L1: LAC I,N
L2: ILDB 0,G↔SETZ 1,
L3: LSHC 0,0
CAML B,ORGBUF↔CAMLE B,ENDBUF↔SKIPA↔IORM 0,(B)↔JUMPE 1,L4
AOS B
CAML B,ORGBUF↔CAMLE B,ENDBUF↔SKIPA↔IORM 1,(B)
L4: SOJG I,L2↔LAC B,B2
ADDI B,WWIDTH↔DAC B,B2
SOJG M,L1↔POP1J
BEND PRINT;BGB 23 MAY 1973.---------------------------------------
SUBR(PLTVEC)XN,YN ;PLOT LINE SEGMENT INTO XGP BUFFER.
BEGIN PLTVEC;-----------------------------------------------------
ACCUMULATORS {DX,DY,D,E,F,T,X0,Y0,ONE,MOVE1}
PTR←1
LAC X0,COL
LAC Y0,ROW
LAC -2(P)
CAIL NCOLS↔GO[OUTSTR[ASCIZ/VECTOR OFF SCREEN → /]↔POP2J]
JUMPL[OUTSTR[ASCIZ/VECTOR OFF SCREEN ← /]↔POP2J]
DAC COL
LAC -1(P)
CAIL MROWS↔GO[OUTSTR[ASCIZ/VECTOR OFF SCREEN ↓ /]↔POP2J]
JUMPL[OUTSTR[ASCIZ/VECTOR OFF SCREEN ↑ /]↔POP2J ]
DAC ROW
CAMLE X0,-2(P)↔GO[EXCH X0,-2(P)↔EXCH Y0,-1(P)↔GO C1]
C1: LAC PTR,X0
IDIVI PTR,=36
MOVN DX,DX
DPB DX,[POINT 6,PTR,5]
ADD PTR,[XWD 440100,0]
LAC DX,Y0
IMULI DX,WWIDTH
ADD PTR,DX
ADD PTR,ORGBUF
ADDI PTR,1
DPB ONE,PTR
C0: MOVEI ONE,1 ;INITIALIZE CONSTANT FOR LOOP
LAC DX,-2(P)↔SUB DX,X0 ;DX←XN-X0;
LAC DY,-1(P)↔SUB DY,Y0 ;DY←YN-Y0;
SKIPN DX
JUMPE DY,POP2J.
LAC D,DX↔ADD D,DY ;D←DX+DY;
LAC T,DY↔SUB T,DX ;T←DY-DX;
SETZ MOVE1, ;MOVE1←0;
SKIPL DY ;IF DY≥0
MOVEI MOVE1,2 ; THEN MOVE1←2;
SKIPL D ;IF D≥0
ADDI MOVE1,2 ; THEN MOVE1←MOVE1+2;
SKIPL T ;IF T≥0
ADDI MOVE1,2 ; THEN MOVE1←MOVE1+2;
JUMPGE DX,[MOVN MOVE1,MOVE1 ;IF DX≥0 THEN MOVE1←8-MOVE1
ADDI MOVE1,=8
GO C2] ;
ADDI MOVE1,=10 ; ELSE MOVE1←MOVE1+10;
C2: MOVM DX,DX ;DX←ABS(DX);
MOVM DY,DY ;DY←ABS(DY);
LAC F,DX↔ADD F,DY ;F←DX+DY;
LAC D,DY↔SUB D,DX ;D←DY-DX;
JUMPGE D,[LAC T,DX ;IF D≥0 THEN BEGIN T←DX;
MOVN D,D↔GO C3] ; D←-D; END
LAC T,DY ; ELSE T←DY;
C3: SETZ E, ;E←0;
LOOP: LAC DX,D↔ADD DX,E ;DX←D+E;
LAC DY,T↔ADD DY,E
ADD DY,DX ;DY←T+E+DX;
JUMPGE DY,[LAC E,DX ;IF DY≥0 THEN BEGIN E←DX;
SUBI F,1 ; F←F-1; COMMENT F←F-1 IS DONE OUTSIDE IF;
JRST @CODE(MOVE1)]; PLOT(MOVE1); END
ADD E,T ; ELSE BEGIN E←E+T; COMMENT F←F-1 IS LATER;
JRST @CODE-1(MOVE1) ; PLOT(MOVE1-1); END
C4: SOJG F,LOOP ;IF F>0 THEN GO LOOP; COMMENT F←F-1 IS DONE HERE;
POP2J
CODE: C
@C+1↔@C+2↔@C+3↔@C+2↔@C+3↔@C+4↔@C+5↔@C+4
@C+5↔@C+6↔@C+7↔@C+6↔@C+7↔@C+8↔@C+1↔@C+8
C: HALT .
[ADDI PTR,WWIDTH↔DPB ONE,PTR↔SOJG F,LOOP↔POP2J] ;1 +Y
[ADDI PTR,WWIDTH↔IDPB ONE,PTR↔SOJG F,LOOP↔POP2J] ;2 +X+Y
[IDPB ONE,PTR↔SOJG F,LOOP↔POP2J] ;3 +X
[SUBI PTR,WWIDTH↔IDPB ONE,PTR↔SOJG F,LOOP↔POP2J] ;4 +X-Y
[SUBI PTR,WWIDTH↔DPB ONE,PTR↔SOJG F,LOOP↔POP2J] ;5 -Y
HALT . ;6 -X-Y
HALT . ;7 -X
HALT . ;8 -X+Y
BEND;2/8/73/(TVR)-------------------------------------------------
SUBR(IIISIM) OUTPUT III BUFFER ONTO XGP.
BEGIN IIISIM______________________________________________________
;III SCALE COMMAND CHARACTRER - MULFAC IS # OF COLS FULL SCREEN.
CALL(GETCHM)↔IMULI 1,NCOLS
ASH 1,-6↔DAC 1,MULFAC#
;III FILE NAME.
CALL(GETFIL)↔POP0J
CALL(INITIO,[17],[SIXBIT/DSK/],[0])
GO[FATAL(CAN'T INIT DSK)]
DAC 1,IIICHN#
CALL(IO,[LOOKUP FILNAM],IIICHN)↔GO FRET
;EXPAND CORE FOR DUMP INPUT.
NIP 1,PPPN↔MOVN 1,1
ADD 1,JOBFF↔DAC 1,BUFEND#
CORE 1,↔GO [FATAL(CAN'T EXPAND CORE)]
;SAVE CURRENT BEAM POSITION.
LAC COL↔DAC BEGCOL#
LAC ROW↔DAC BEGROW#
;DUMP III FILE IN.
LAC JOBFF↔ADDM PPPN
CALL(IO,[IN PPPN],IIICHN)
LAC 1,JOBFF↔ADDI 1,2↔DAC 1,PC# ;III PC.
OUTSTR[ASCIZ/READING III BUFFER.../]
L1: CDR 1,BUFEND↔DZM -1(1)↔DZM(1)
CAIL 1,JOBREL↔GO .+3
LIPI -1(1)↔BLT JOBREL ;CLEAR TOP.
;FETCH AND DECODE III COMMAND WORD.
ILOOP: AOSA 1,PC
LOOP: LAC 1,PC↔CAMLE 1,JOBFF
CAML 1,BUFEND↔GO RET
LAC 2,(1)
TRNE 2,01↔GO XTEXT ;TEXT COMMAND WORD.
TRNE 2,02↔GO XVECTR ;VECTOR COMMAND WORD.
TRNE 2,20↔GO XCTRL ;III CONTROL WORD.
TRNE 2,37↔GO ILOOP ;NOP & HALT COMMANDS.
GO RET
;EXECUTE III TEXT.
XTEXT: PUSH P,2 ;-2(P)
PUSH P,[5] ;-1(P)
PUSH P,[POINT 7,-2(P)] ; 0(P)
CLOOP: ILDB 1,0(P)↔JUMPE 1,CCONT
CAIN 1,15↔GO[LAC -4(P)↔DAC COL↔GO CCONT]
CDR 1,%(1)
ADDI 1,%
CALL(PLAG,1)
CCONT: SOSLE -1(P)↔GO CLOOP
SUB P,[XWD 3,3]
GO ILOOP
;EXECUTE VECTORS.
XVECTR: TRNN 2,4
GO [TRNN 2,10 ;SHORT VECTOR OR TSS
GO SVECT ;SHORT VECTOR
GO ILOOP] ;TSS
LDB [POINT 11,2,10]↔ROT -13 ;X
PUSHJ P,GRONK
LDB [POINT 11,2,21]↔ROT -13 ;Y
MOVN↔PUSHJ P,GRONK
LDB 1,[POINT 3,2,31]
PUSHJ P,@PLOTAB(1)
GO ILOOP
;EXECUTE III CONTROL OPERATIONS.
XCTRL: TRNN 2,04↔GO[CAR 1,2↔DAC 1,PC↔GO LOOP] ;JUMP.
TRNE 2,40↔GO LOOP ;SAVE A NOP HERE
AOS 1,PC ;JSR
HRLI 1,20
CAR 2,2
CAMLE 2,JOBFF
CAML 2,BUFEND↔GO[ OUTSTR[ASCIZ/JSR OUT OF BOUNDS
/]↔ GO RET]
DAC 1,(2)↔DAC 2,PC
GO ILOOP
;IIISIM CONTINUED.
RET: AOS(P)↔OUTSTR[ASCIZ/FINISHED
/]
FRET: CALL(IO,[RELEASE],IIICHN)
LAC 1,JOBFF
CORE 1,↔GO [FATAL(CAN'T SHRINK CORE!)]
LAC BEGCOL↔DAC COL
LAC BEGROW↔DAC ROW
POP0J
SVECT: PUSH P,2
LDB [POINT 7,2,6]↔ROT -7
PUSHJ P,GRONK
LDB [POINT 7,2,13]↔ROT -7
MOVN
PUSHJ P,GRONK
LDB 1,[POINT 2,2,15]
PUSHJ P,@PLOTAB(1)
POP P,2
LDB [POINT 7,2,22]↔ROT -7
PUSHJ P,GRONK
LDB [POINT 7,2,29]↔ROT -7
PUSHJ P,GRONK
LDB 1,[POINT 2,2,31]
PUSHJ P,@PLOTAB(1)
GO ILOOP
GRONK: ADD[2B2]
MUL MULFAC
EXCH 0,(P)
JRST @0
PLOTAB: [RVECT: CALL(RELATE)↔CALL(PLTVEC,1,2)↔POP2J]
[RPNT: CALL(RELATE)↔DAC 1,COL↔DAC 2,ROW↔GO PLTVEC]
[RIVECT: CALL(RELATE)↔DAC 1,COL↔DAC 2,ROW↔POP2J]
RPNT
[AVECT: CALL(ABSOLUTE)↔GO PLTVEC] ;ARGS ARE ALREADY STACKED
[APNT: CALL(ABSOLUTE)↔DAC 1,COL↔DAC 2,ROW↔GO PLTVEC]
[AIVECT: CALL(ABSOLUTE)↔DAC 1,COL↔DAC 2,ROW↔POP2J]
APNT
RELATE: MOVSI -200000↔MUL MULFAC↔LAC 1,0↔ADD 1,COL↔ADDB 1,-3(P)
LAC 2,0↔ADDB 2,-2(P)↔ADD 1,ROW↔POP0J
ABSOLU: LAC 1,BEGCOL↔ADDB 1,-3(P)↔LAC 2,BEGROW↔ADDB 2,-2(P)↔POP0J
BEND;2/8/73/(TVR)21 MAY 1973(BGB)---------------------------------
SUBR(GETFIL) ;GET FILE SPEC FROM TTY LINE.
BEGIN GETFIL;_____________________________________________________
SETZM FILNAM↔SETZM EXTION
SETZM EXTION+1↔SETZM PPPN
LAC 4,[POINT 6,FILNAM,-1]↔LACI 2,6
CALL(GETCHR)↔POP0J↔CAIN 1,15↔GO[CALL(GETCHR)↔POP0J↔POP0J]↔AOS(P)
JRST L+2
L: CALL(GETCHR)↔POP0J
CAILE 1,"z"↔POP0J
CAIL 1,"a"↔SUBI 1,40 ;CONVERT LOWER CASE
CAIN 1,"."↔GO[LAC 4,[POINT 6,EXTION,-1]↔LACI 2,3↔GO L]
CAIN 1,"["↔GO[LAC 4,[POINT 6,PPPN,-1] ↔LACI 2,3↔GO L]
CAIN 1,","↔GO[CAR PPPN
PUSHJ P,[PPJUST: JUMPE [OUTSTR[ASCIZ/BAD P,PN/]
CLRBFI↔SOS -1(P)↔CRLF↔POP1J]
TRNE 77↔POP0J↔LSH -6↔GO PPJUST]
DIP PPPN↔LAC 4,[POINT 6,PPPN,17]↔LACI 2,3↔GO L]
CAIN 1,"]"↔GO[CDR PPPN↔CALL(PPJUST)
DAP PPPN↔CALL(GETCHR)↔POP0J↔GO FINQ]
FINQ: CAIN 1,15↔GO EOL ;END OF THE LINE.
CAIN 1,12↔POP0J
CAIN 1,"→"↔POP0J
CAIG 1," "↔GO L ;IGNORE GARBAGE.
SOJL 2,L↔SUBI 1,40↔IDPB 1,4↔GO L
EOL: CALL(GETCHR)↔POP0J↔POP0J
BEND;1/31/73,2/7/73(TVR)----------------------------------------------
SUBR(INITIO) GET AND OPEN A CHANNEL.
BEGIN INITIO;_____________________________________________________
MOVEI 1,17 ;SEARCH FOR FREE CHANNEL
SKIPE JOBJDA(1)
SOJGE 1,.-1
JUMPL 1,[OUTSTR[ASCIZ+OUT OF I/O CHANNELS!
+]↔ POP3J]
LAC [ OPEN -3(P)]
DPB 1,[POINT 4,0,12]
XCT 0
POP3J
AOS (P)
POP3J
BEND;2/7/73/(TVR)-------------------------------------------------
SUBR(IO,OPCODE,CHAN)----------------------------------------------
BEGIN IO
LAC -1(P)
DPB [POINT 4,-2(P),12]
XCT -2(P)
POP2J
AOS (P)
POP2J
BEND;2/7/73/(TVR)-------------------------------------------------
SUBR(GETCHR) GET CHARACTER AND SKIP.
BEGIN GETCHR;_____________________________________________________
SKIPE TTYFLAG↔GO[INCHWL 1↔AOS(P)↔POP0J]
SKIPGE 1,IOPTR↔POP0J
SOSLE IBUF+2(1)
GO[RETCHR: ILDB 1,IBUF+1(1)↔AOS(P)↔POP0J]
CALL(IO,[IN],<CHANTB(1)>)
GO RETCHR
CALL(IO,[STATO 1B22],<CHANTB(1)>)
GO [OUTSTR[ASCIZ/READ ERROR /]
HALT RETCHR]
CALL(IO,[RELEASE],<CHANTB(1)>) ;EOF.
SUBI 1,4
DAC 1,IOPTR
GO GETCHR
POP0J
BEND;2/7/73(TVR)--------------------------------------------------
SUBR(GETCHM) GET CHARACTER.
BEGIN GETCHM
CALL(GETCHR)
GO [FATAL(UNEXPECTED EOF)]
POP0J
BEND GETCHM;2/7/73(TVR)-------------------------------------------
SUBR(RDNUM)-------------------------------------------------------
BEGIN RDNUM;
CALL(GETCHM)↔HRREI 2,-100(1)↔ASH 2,7 ;7 HIGH ORDER BITS.
CALL(GETCHM)↔LAC 0,2↔ADD 0,1 ;7 LOW ORDER BITS.
POP0J
BEND RDNUM;-------------------------------------------------------
SUBR(RDPAIR)------------------------------------------------------
BEGIN RDPAIR;
CALL(RDNUM)↔LAC 3,0↔JUMPL XLOSE↔CAILE NCOLS
GO[XLOSE: CALL(RDNUM)↔POP0J]
CALL(RDNUM)↔JUMPL YLOSE↔CAILE MROWS
GO[YLOSE: POP0J]
AOS(P)↔POP0J
BEND RDPAIR;------------------------------------------------------
SUBR(INITXT) INITIALIZE TEXT FILE.
BEGIN INITXT;_____________________________________________________
LACI 2,4↔ADD 2,IOPTR
CAIL 2,4*MAXFILES↔GO[FATAL(TOO MANY INDIRECT FILES!)]
LACI IBUF(2)
CALL (INITIO,[0],[SIXBIT/DSK/],0)↔GO[FATAL(CAN'T INIT DSK)]
DAC 1,CHANTB(2)
SKIPE TTYFLAG↔OUTSTR [ASCIZ/TEXT: /]
CALL(GETFIL)↔GO FRET
CAIE 1,12↔GO[OUTSTR[ASCIZ/ILLEGAL FILE TERMINATOR:/]
OUTCHR 1↔GO FRET]
LACI 2,4↔ADDB 2,IOPTR
CALL (IO,[LOOKUP FILNAM],<CHANTB(2)>)
GO[OUTSTR[ASCIZ/FILE NOT FOUND.
/]
FRET: LACI 2,4↔SUBM 2,IOPTR↔CALL(IO,[RELEASE],<CHANTB(2)>)
POP0J]
AOS(P)
POP0J
BEND;2/7/73(TVR)--------------------------------------------------
SUBR(DEFONT) DEFINE A FONT.
BEGIN DEFONT;_____________________________________________________
PUSH P,[17]
PUSH P,[SIXBIT/DSK/]
PUSH P,[0]
PUSHJ P,INITIO ;INITIALIZE
GO [FATAL(CAN'T INIT DSK)]
DAC 1,FONTCH
SKIPE TTYFLAG
OUTSTR [ASCIZ/FONT: /]
CALL(GETFIL)↔POP0J
CAIE 1,"→"↔CAIN 1,12↔GO OK
OUTSTR[ASCIZ/ILLEGAL FILE TERMINATOR:/]↔CALL(ONECHR)↔CLRBFI↔GO FRET]
OK: CALL (IO,[LOOKUP FILNAM],FONTCH)
GO [ HRLI 'XAP'↔SKIPN EXTION↔HLLZM EXTION
CALL (IO,[LOOKUP FILNAM],FONTCH)
GO [ LAC FNTPPN↔SKIPN PPPN↔DAC PPPN
CALL (IO,[LOOKUP FILNAM],FONTCH)
GO [ OUTSTR[ASCIZ/NOT FOUND, TRY AGAIN
/]
POP0J]
GO .+1]
GO .+1]
CAIN 1,"→"↔GO [ CALL(GETCHM) ;DEFINING FONT NUMBER ≠0?
CAIL 1,"0"↔CAIL 1,"0"+MAXFONT
GO [OUTSTR[ASCIZ/ILLEGAL FONT NUMBER:/]
CLRBFI↔CALL(ONECHR)↔CRLF↔GO FRET]
INCHSL↔JFCL↔CAIE 12↔INCHSL↔JFCL
SUBI 1,"0"↔GO CONT]
SETZ 1,
↑RPGFNT: ;ENTRY FOR RPG MODE
CONT: DAC 1,FONT
SETZ↔SEGNUM ;GET SEGMENT NUMBER
CAMN FONTAB(1)↔GO SEGOK ;IF SAME AS TABLE, WE WIN
SKIPE 0↔DETSEG ;DETACH CURRENT SEGMENT IF ANY
LAC FONTAB(1) ;GET NUMBER OF DESIRED SEGMENT
JUMPE SEGOK
ATTSEG
GO [OUTSTR[ASCIZ/OOPS, MY SEGMENT WENT AWAY! /]
HALT SEGOK]
SEGOK: LAC PPPN↔LAPI %↔SOS↔DAC INARG ;IOWD.
MOVS PPPN↔MOVMS↔ADDI %
DAC MAXADR↔CORE2↔HALT ;MAKE UPPER SEG.
SKIPN FONTAB(1)↔GO[SETZ↔SEGNUM
DAC FONTAB(1) ;REMEMBER SEG, NUMBER
LAC[SIXBIT/FONT00/]↔ADD 1
CALLI %+36↔JFCL↔GO RDFONT] ;NAME UPPER SEG.
RDFONT: CALL (IO,[IN [INARG:0↔0]],FONTCH])
LACI 1,177 ;CONSISTANCY CHECKING HERE
CKLOOP: SKIPLE 2,%(1)↔GO[ADDI 2,%↔CAML 2,MAXADR↔GO BADFNT
CDR (2)↔CDR 3,(2)↔IMUL 3↔ADDI %+3(2)
CAML MAXADR↔GO BADFNT
SOJGE 1,CKLOOP↔GO FONTOK]
ADDI 2,SPTABE-SPTABL↔JUMPL 2,BADFNT↔SOJGE 1,CKLOOP
FONTOK: CALL(SETFNT)
AOS (P)
FRET: CALL (IO,[RELEASE],FONTCH)
POP0J
BADFNT: OUTSTR[ASCIZ/BAD CHARACTER IN FONT #/]
LACI 0,"0"↔ADD 0,FONT↔OUTCHR 0
OUTSTR[ASCIZ/:/]↔CALL(ONECHR)↔SETZM %(1)
CRLF↔SOJGE 1,CKLOOP↔GO FONTOK
↑FONTCH: 0
MAXADR: 0
BEND DEFONT;2/7/72(TVR)-------------------------------------------
SUBR(ONECHR)------------------------------------------------------
BEGIN ONECHR
JUMPE 1,[OUTSTR [ASCIZ/<NULL>/]↔POP0J]
CAIN 1," "↔GO[OUTSTR[ASCIZ/<SPACE>/]↔POP0J]
CAIL 1,11↔CAILE 1,15↔GO[OUTCHR 1↔POP0J]
OUTSTR @[[ASCIZ/<TAB>/]
[ASCIZ/<LF>/]
[ASCIZ/<VT>/]
[ASCIZ/<FF>/]
[ASCIZ/<CR>/]]-11(1)
POP0J
BEND ONECHR;2/7/72(TVR)-------------------------------------------
SUBR(SETFNT) SETUP A FONT.
BEGIN SETFNT;_____________________________________________________
LACI =40↔DAC DROW ;LINE FEED DEFAULT.
LAC 2,%+12↔JUMPN 2,[ ;LINE FEED SPECIFIED.
NIP 0,%+1(2)↔NIP 1,%+2(2)
ADD 0,1↔DAC 0,DROW↔GO .+1]
LACI =25↔DAC DCOL ;SPACE DEFAULT.
LAC 2,%+40↔JUMPN 2,[ ;SPACE SPECIFIED.
NAP 0,%+1(2)↔NAP 1,%+2(2)
ADD 0,1↔DAC 0,DCOL↔GO .+1]
POP0J
BEND SETFNT;2/7/72(TVR)-------------------------------------------
;START ADDRESS ENTRY.
SA: TDCA
RPGSA: SETA↔DAC RPGSW
CALLI 0 ;RESET I/O AND CORE
CAR JOBSA↔DAC JOBFF
CORE↔JFCL ;CORE DOWN
LAC 17,[IOWD 100,PDL] ;INITIALIZE TABLES
SETZM FONTAB
LAC[XWD FONTAB,FONTAB+1]↔BLT FONTAB+9
SETZM LMAR↔LACI =1440↔DAC RMAR
;RE-ENTRY ADDRESS.
REE: LACI .↔DAC 124
LACI 4↔MOVNM IOPTR
SETOM TTYFLAG
SKIPE RPGSW↔GO RPG
;INITIALIZE XGP BUFFER.
restar: CALL(DEFONT)↔GO .-1
CALL(INITXT)↔GO .-1
RPGCON: SETZM TTYFLAG
CALL(MKBUF)
;DEFAULT INITIALIZE MARGINS.
LACI =100↔DAC ROWMIN↔DAC ROW
LACI MROWS-=200↔DAC ROWMAX
LACI =100↔DAC LMAR↔DAC COL
LACI NCOLS↔DAC RMAR
GO XPRINT
;RPG-ENTRY.
RPG: SETZM RPGSW
CALL(INITIO,[0],[SIXBIT/DSK/],[IBUF])
GO[FATAL(CAN'T INIT DSK!)]
DAC 1,CHANTB
CALL(IO,[LOOKUP 4],CHANTB);
GO[OUTSTR[ASCIZ/TEXT FILE NOT FOUND - GETRPG
/]↔ GO SA]
SETZM IOPTR
CALL(INITIO,[17],[SIXBIT/DSK/],[0])
GO[FATAL(CAN'T INIT DSK!)]
DAC 1,FONTCH
CALL(IO,[LOOKUP 10],FONTCH);
GO[OUTSTR[ASCIZ/FONT FILE NOT FOUND - GETRPG
/]↔ GO SA]
DAC 13,PPPN ;SAVE LENGTH
LAC 1,14
JUMPL 1,[RPGLOSE: OUTSTR[ASCIZ/ILLEGAL FONT NUMBER
/]
GO SA]
CAILE 1,MAXFONT
GO RPGLOSE
CALL(RPGFNT)
GO [OUTSTR[ASCIZ/BAD FONT FILE
/]↔ GO SA]
OUTSTR [ASCIZ/XAP INITIALIZED IN RPG MODE.
/]
GO RPGCON
;XGP PRINT A CHARACTER.
XPRINT: CALL(GETCHR)↔GO FINISH ;EOF.
JUMPE 1,XPRINT ;NULL.
CAIN 1,11↔GO[LAC COL↔SUB LMAR↔IDIV DCOL ;TAB.
ANDCMI 7↔ADDI 8↔IMUL DCOL↔ADD LMAR
DAC COL↔GO XPRINT]
CAIN 1,15↔GO[LAC LMAR↔DAC COL↔GO XPRINT] ;RETURN.
CAIN 1,14↔GO[FORMFEED: CALL(XGPOUT) ;FF.
LAC ROWMIN↔DAC ROW
LAC LMAR↔DAC COL↔GO XPRINT]
CAIN 1,40↔GO[SPACE: LAC DCOL↔ADDM COL↔GO COLCHK];SPACE.
CAIN 1,12↔GO[LAC DROW↔ADDM ROW↔GO ROWCHK] ;LINE FEED
CAIN 1,177↔GO ESC1 ;B.S. (default special char.)
;FONT TABLE LOOKUP AND PLACE CHARACTER'S GLYPH INTO XGP BUFFER.
HIDDEN: HRRE 0,%(1)
JUMPLE SPCHAR↔ADDI %
CALL(PLAG,0)
;COLUMN OVERFLOW - DEFAULT CRLF.
COLCHK: LAC COL↔CAMLE RMAR↔GO[LAC LMAR↔DAC COL↔LAC DROW
ADDM ROW↔GO ROWCHK]
ROWCHK: LAC ROW↔CAMGE ROWMAX↔GO XPRINT↔GO FORMFEED ;ROW OVERFLOW.
FINISH: CALL(XGPOUT)↔CALLI 0 ;FLUSH BUFFERS
LAC JOBFF
CORE↔OUTSTR[ASCIZ/COULDN'T SHRINK CORE/] ;AND THEIR CORE
MOVEI 1,MAXFONT
FINIS2: LAC FONTAB(1)↔ATTSEG↔JFCL↔SETZ↔CORE2
JFCL↔SOJGE 1,FINIS2 ;FLUSH UPPER(S)
CALLI 12 ;EXIT
;EXECUTE COMMAND CHARACTERS.
SPCHAR:
ADDI SPTABEND
LAC @0
JRST @0
SPTABL:
ESC1 ;-1 BINARY FORM OF ESCAPE
SPTABE: [LAC %+" "
DAC %(1)
OUTSTR[ASCIZ/UNDEFINED CHARACTER:/]
CALL(ONECHR)
CRLF
JRST SPACE] ; 0 UNDEFINED CHARACTER
ESC1: CALL(GETCHM)
SKIPE ESC1TB(1)
JRST @ESC1TB(1)
OUTSTR [ASCIZ/UNDEFINED COMMAND:/]
CALL(ONECHR)
CRLF
JRST XPRINT
;ESCAPE CHARACTER TABLE.
ESC1TB: HIDDEN ;CENTER DOT
0↔0↔0↔0↔0↔0↔0 ;0-6 ↓αβ∧¬επ
[CALL(DEFONT) ;7 λ (DEFINE A FONT)
GO [OUTSTR[ASCIZ/FONT NOT FOUND.
/]↔ GO XPRINT]
GO XPRINT]
HIDDEN↔0↔HIDDEN↔HIDDEN↔HIDDEN ;11-15 (HIDDEN CHARACTERS)
0↔0 ;16-17 ∞∂
[MOVEI 2↔GO PARTPG] ;20 ⊂ (1/2 PAGE)
[OUTSTR[ASCIZ/CAN'T CROSS PAGE BOUNDARIES, SORRY/]
LAC DROW↔ADDM ROW↔GO ROWCHK] ;21 ⊃
[MOVEI 3↔IMUL DROW↔ADDM ROW
GO ROWCHK] ;22 ∩ (3 LINES)
[MOVEI 3↔GO PARTPG] ;23 ∪ (1/3 PAGE)
[MOVEI 6↔GO PARTPG] ;24 ∀ (1/6 PAGE)
0↔[PUSHJ P,IIISIM↔JFCL↔GO XPRINT]↔0 ;25-27 ∃⊗↔
0↔0↔0↔0↔0↔0↔0↔0 ;30-37 _→~≠≤≥≡∨
[PUSHJ P,SXINC↔GO COLCHK] ;40 (SPACE, INC X POS)
0↔0↔0↔0↔0↔0↔0 ;41-47 !"#$%&'
0↔0↔0↔0↔0↔0↔0↔0 ;50-57 ()*+,-./
CHGFNT↔CHGFNT↔CHGFNT↔CHGFNT ;60-63 0123 (SET FONT NUMBER)
CHGFNT↔CHGFNT↔CHGFNT↔CHGFNT ;64-67 4567 (SET FONT NUMBER)
CHGFNT↔CHGFNT ;70-71 89 (SET FONT NUMBER)
0↔0↔0↔0↔0↔0 ;72-77 :;<=>?
REQFIL↔0↔0↔0↔0↔0↔0↔0 ;100-107 @ABCDEFG
0↔IVECT↔0↔0↔0↔SETMAR↔0↔0 ;110-117 HIJKLMNO
PVECT↔0↔0↔0↔0↔0↔VECT↔0 ;120-127 PQRSTUVW
0↔0↔0↔0↔0↔0↔0↔0 ;130-137 XYZ[\]↑←
0↔0↔0↔0↔0↔0↔0↔0 ;140-147 `abcdefg
0↔0↔0↔0↔0↔0↔0↔0 ;150-157 hijklmno
0↔0↔0↔0↔0↔0↔0↔0 ;160-167 pqrstuvw
0↔0↔0↔0 ;170-173 xyz{
0↔XPRINT↔0 ;174-176 |~}
[CALL (GETCHM)↔ADD COL↔JUMPL XPRINT
DAC COL↔GO XPRINT] ;177
;SPACE PART OF PAGE DOWN
PARTPG: LAC 1,ROW↔SUB 1,ROWMIN↔IMUL 1,0↔LAC 3,ROWMAX
SUB 3,ROWMIN↔IDIV 1,3↔ADDI 1,1↔IMUL 1,3↔IDIV 1,0
ADD 1,ROWMIN↔DAC 1,ROW↔GO ROWCHK
;INC. POSITION
SXINC: CALL(GETCHM)↔ADDM 1,COL↔POPJ P,
SYINC: CALL(GETCHM)↔ADDM 1,ROW↔POPJ P,
;SWITCH FONTS
CHGFNT: CAILE 1,MAXFONT+"0"↔GO[OUTSTR[ASCIZ/ILLEGAL FONT NUMBER:/]
CALL(ONECHR)↔GO XPRINT]
SKIPE 2,FONTAB-"0"(1)
GO [DETSEG
ATTSEG 2,↔GO[OUTSTR[ASCIZ/OOPS, MY SEGMENT WENT AWAY!/]
HALT .+1]
CALL(SETFNT)↔GO XPRINT]
OUTSTR [ASCIZ/UNDEFINE CHARACTER SET #/]
OUTCHR 1
GO XPRINT
;INDIRECT FILE
REQFIL: CALL(INITXT)↔GO[OUTSTR[ASCIZ/REQUIRED TEXT FILE NOT FOUND
/]↔GO XPRINT]
OUTSTR[ASCIZ/REQUIRE TEXT COMMAND SEEN.
/]↔ GO XPRINT
;SET MARGINS
SETMAR: CALL(GETCHM)↔LAC 3,1↔CALL(RDNUM)
JUMPL 1,BADMAR
CAIN 3,"L"↔GO[CAML RMAR↔GO BADMAR↔DAC LMAR↔DAC COL↔GO XPRINT]
CAIN 3,"R"↔GO[CAIG 1,NCOLS↔CAMG LMAR↔GO BADMAR↔DAC RMAR↔GO XPRINT]
CAIN 3,"T"↔GO[CAML ROWMAX↔GO BADMAR↔DAC ROWMIN↔CAML ROW
DAC ROW↔GO XPRINT]
CAIN 3,"B"↔GO[CAIG MROWS↔CAMG ROWMIN↔GO BADMAR↔DAC ROWMAX
CAML ROW↔GO XPRINT↔GO FORMFEED]
BADMAR: OUTSTR[ASCIZ/ILLEGAL MARGIN COMMAND /]↔OUTCHR 3↔CRLF↔GO XPRINT
VECT: CALL(RDPAIR)↔GO VLOSE↔CALL(PLTVEC,3,0)↔GO XPRINT
IVECT: CALL(RDPAIR)↔GO VLOSE↔DAC 3,COL↔DAC ROW↔GO XPRINT
PVECT: CALL(RDPAIR)↔GO VLOSE↔DAC 3,COL↔DAC ROW↔CALL(PLTVEC,3,0)
GO XPRINT
VLOSE: OUTSTR[ASCIZ/VECTOR OFF SCREEN
/]↔ GO XPRINT
;XAP DOCUMENTATION.
COMMENT∞ XAP - XEROR ASSEMBLE AND PRINT.
Bruce g. Baumgart & Tovar Mock.
XAP converts text, graphics and video into XGP binary rasters.
PRINTIBLE PAGE SIZE 7.5" BY 10"
7.5" IS 40 WORDS PER LINE IS 1440 XCOLUMNS.
10" IS 2000 XROWS.
BUFFER SIZE IS (41 WORDS PER ROW)*(2000 ROWS) = 82000 WORDS.
OLDE XAP FONT FILE FORMAT.
FONT: BLOCK 177 ; =128 WORD GLYPH POINTER TABLE.
GLYPH1: XWD ROWS,WORDS ;ROWS IN THE GLYPH, WORD WIDTH OF GLYPH.
XWD R0,C0 ;GLYPH ORIGIN RELATIVE TO PEN POSITION.
XWD R1,C1 ;GLYPH TERMINUS RELATIVE TO PEN POSITION.
BLOCK ROWS*WORDS
;XAP TILDE COMMANDS.
The XAP escape character is TILDE, "~", ASCII 32 octal.
1. DECLARE A FONT.
~M<n><font file name>
2. SELECT A FONT.
~F<n> select font <n>.
~f<n> one character only.
~{<n> declare curly brackets as font <n> delimiters.
Works for ` { ( [ ⊂ < ≤ that is curly brackets
parens, square brackets, left and right horse shoes, left and
right angle brackets "<>", left and right anglebar brackets "≤≥".
3. VECTORS.
~V<row>,<column> visible vector.
~I<row>,<column> invisible vector.
~D<row>,<column> dashed vector.
4. CIRCULAR ARCS.
5. GENERAL ARCS.
6. III BUFFERS.
7. INDIRECT TEXT FILES.
8. VIDEO IMAGES.
9. ESCAPE CHARACTER COMMANDS.
~~ Quote escape character.
change escape character.
;XAP RUBOUT COMMANDS.
These commands are preceded with RUBOUT '177.
The escape characters which print hidden characters on LPT will
output the same characters on the XGP if they are defined in the
character set currently being used. The line spacing commands for
the LPT should also do the same on the XGP with the exception of
'177 '21 (line space over page boundary).
0-9 Select character set number specified by digit.
λ<file>→<digit> Define character set number and load set into upper
segment.
<space><char.> Takes octal value of character to be number of bits
to LAC right.
<rubout><char.> Takes octal value of character to be number of bits
to LAC left.
MR<number> Set Right margin to <number> (in XGP co-ordinates).
ML<number> Set Left margin to <number> (in XGP co-ordinates).
MB<number> Set Bottom margin to <number> (in XGP co-ordinates).
MT<number> Set Top margin to <number> (in XGP co-ordinates).
V<number><number> Visible vector to <number>,<number> (in XGP points).
I<number><number> Invisible vector to <number>,<number> (in XGP points).
P<number><number> Point vector to <number>,<number> (in XGP points).
<altmode> No-op (when placed in text, if not deleted explicitly
protects a line from being changed by TV or E).
@<file><crlf> Inserts file at this point in listing.
⊗<char><file><crlf> Inserts III buffer at this point in file, relocated
by current position and multiplied by char/64. When
finished leaves cursor at same position.
<number> Defined by two character. Equal to:
(CHAR1-'100)*'200+CHAR2. A SAIL procedure to generate
a number would be:
STRING PROCEDURE MAKNUM(INTEGER X);
RETURN(((X % 200)+'100) & (X LAND '177));
RPG Mode:
Start at starting address + 1 with accumulator contents:
4:7 Text file name↔ extesion↔ 0↔ ppn
10:13 Font file name↔ extesion↔ 0↔ ppn (must be completely specified)
14 Font number for font
∞;
END SA